/*
 * 密码核心组件 PasswordCore
 * author:yanmu.wj@taobao.com
 * date:2011-11-20
 */
KISSY.add('PasswordCore',function(S){
    var PasswordCore = function(password){
        this.password = password || '';
    };
    var _PasswordCore = function(password){
        return new pwc(password);
    };
    S.augment(PasswordCore,{
        regex:{
            //哪些字符是非法字符？
            illegal:/[^0-9a-zA-Z!@#$%^&*?_.-~]/g,
            allNumber:/^\d+$/g,
            allLetter:/^[a-zA-Z]+$/g,
            allSame:/^([\s\S])\1*$/,
            number:/\d/g,
            letter:/[a-zA-Z]/g,
            lowerAndUpperLetter:/[a-z][^a-z]*[A-Z]|[A-Z][^A-Z][a-z]/g,
            numberAndLetter:/\d|[a-zA-z]/g,
            character:/[!@#$%^&*?_.-~]/g
        },
        /*
         * 密码强度评分
         * @link http://www.planabc.net/2008/05/11/password_strength_meter/
         */
        score:function(){
            var _score = 0;
            if(this.isIllegal()){
                return _score;
            }

            /*
             * 长度
             * 1<长度<=4 : 5分
             * 4<长度<8  : 10分
             * 长度<=9   : 25分
             */
            var _length = this.size();
            if(_length <= 4){
                _score += 5;
            }else if(_length > 4 && this.password < 8){
                _score += 10;
            }else if(_length >= 8){
                _score += 25;
            }
            /*
             * 字母
             * 大小写字母混合 : 20分
             * 大/小写字母    : 10分
             */
            var _hasLowerAndUpperLetter = this.hasLowerAndUpperLetter(),
                _hasLetter = this.hasLetter();
            if(_hasLowerAndUpperLetter){
                _score += 20;
            }else if(_hasLetter){
                _score += 10;
            }

            /*
             * 数字
             * 数字数>=3  : 20分
             * 1<数字数<3 : 10分
             */
            var _hasNumber = this.hasNumber();
            if(_hasNumber >= 3){
                _score += 20;
            }else if(_hasNumber){
                _score += 10;
            }

            /*
             * 符号
             * 符号数>=3  : 25分
             * 1<符号数<3 : 10分
             */
            var _hasCharacter = this.hasCharacter();
            if(_hasCharacter >= 3){
                _score += 25;
            }else if(_hasCharacter){
                _score += 10;
            }

            /*
             * 奖励
             * 大小写字母、数字、符号  : 10分
             * 大/小写字母、数字、符号 : 5分
             * 字母、数字              : 2分
             */
            if(_hasLowerAndUpperLetter && _hasNumber && _hasCharacter){
                _score += 10;
            }else if(_hasLetter && _hasNumber && _hasCharacter){
                _score += 5;
            }else if(_hasLetter && _hasNumber){
                _score += 2;
            }

            return _score;
        },
        level:function(){
            var _level = 0;
            var _score = Math.floor(this.score()/10);
            switch(_score){
                //非常安全
                case 10:
                case 9:
                    _level = 7;
                    break;
                //安全
                case 8:
                    _level = 6;
                    break;
                //非常强
                case 7:
                    _level = 5;
                    break;
                //强
                case 6:
                    _level = 4;
                    break;
                //一般
                case 5:
                    _level = 3;
                    break;
                //弱
                case 4:
                case 3:
                    _level = 2;
                    break;
                //非常弱
                default:
                    _level = 1;
                    break;
            }
            return _level;
        },
        /*
         * 密码长度
         */
        size:function(){
            return this.password.length;
        },
        /*
         * 包含非法字符
         */
        isIllegal:function(){
            return !!this.password.match(this.regex.illegal);
        },
        /*
         * 全数字
         */
        isAllNumber:function(){
            return !!this.password.match(this.regex.allNumber);
        },
        /*
         * 全字母
         */
        isAllLetter:function(){
            return !!this.password.match(this.regex.allLetter);
        },
        /*
         * 全相同字符
         */
        isAllSame:function(){
            return !!this.password.match(this.regex.allSame);
        },
        /*
         * 包含数字
         */
        hasNumber:function(){
            return (this.password.match(this.regex.number)||[]).length;
        },
        /*
         * 包含字母
         */
        hasLetter:function(){
            return (this.password.match(this.regex.letter)||[]).length;
        },
        /*
         * 包含大小写字母
         */
        hasLowerAndUpperLetter:function(){
            return !!this.password.match(this.regex.lowerAndUpperLetter);
        },
        /*
         * 包含数字和字母
         */
        hasNumberAndLetter:function(){
            return (this.password.match(this.regex.numberAndLetter)||[]).length >=2 ? true : false;
        },
        /*
         * 包含特殊字符
         */
        hasCharacter:function(){
            return (this.password.match(this.regex.character)||[]).length;
        }
    });
    return _PasswordCore;
});
